<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /* 
    变量提升  ==> 变量声明提升 ==> 如何证明它?
        ==> JS在执行代码前会预解析
    function fn1() { // 函数声明语句
      
    }
    // new Function()
    var a;
    console.log(a);
    a = 3;
    */
    fn1()
    console.log(a)
    var a = 3

    /* 
    函数提升 ==> 函数声明提升 ==> 如何证明?

    函数定义的方式
      1. 函数声明
      2. 函数表达式
    语句
      可以单独存在(一条能解析运行的完整指令)
      做一个特定的工作
    表达式
      不能单独存在(不是一条能解析运行的完整指令)
      总会返回一个结果数据

    执行函数
      执行函数对象中包含的语句
    执行函数声明:
      创建函数对象, 定义一个函数名变量, 并将函数对象赋值给这个变量

    一般的对象: 存储数据
      var obj = {m: 1, n: [1, 2]}
    函数对象: 存储可执行的语句  ==> 是可以反复执行的
    */

    // var obj = {m: 1}
    function fn1() { // 函数声明语句
      
    }
    var fn2 = function () {  // 函数表达式
      
    }

    /* //IIFE   Immediately Invoked Function Expression  立即执行函数表达式
    (function () {
      
    })()

    fn1();  // fn1()是一个表达式
    var f = fn1() // fn1()是一个表达式


    {{fn();}} */

  </script>
</body>
</html>